import SSH2Promise from 'ssh2-promise'
import SSHConfig from 'ssh2-promise/lib/sshConfig'
import { SSHResultType } from '../types'
import { SSHErrorMiddleware } from '../middlewares'

/**
 * 测试 SSH 连接（对于报错未进行处理，直接返回错误对象）
 *
 * @param config SSH 连接配置（host/port/username/password 等）
 * @param testCommand 用于验证 SSH 连接是否成功的测试命令，默认为 `echo "Connection test"`
 * @returns 返回值 测试结果
 */
export const testConn = async (
  config: SSHConfig,
  testCommand: string = 'echo "Connection test"'
): Promise<SSHResultType> => {
  const ssh = new SSH2Promise(config)
  try {
    await ssh.connect()
    const result = await ssh.exec(testCommand as string)
    return {
      success: true,
      server: `${config.host}:${config.port ?? 22}`,
      message: '连接成功',
      detail: result.stdout?.trim()
    }
  } catch (e) {
    return Promise.reject(e)
  } finally {
    await ssh.close().catch(() => {})
  }
}

export type TestConnType = typeof testConn

/**
 * 测试 SSH 连接（对于报错使用 {@link SSHErrorMiddleware} 进行处理）
 *
 * @param config SSH 连接配置（host/port/username/password 等）
 * @param options 配置选项
 * - testCommand 用于验证 SSH 连接是否成功的测试命令，默认为 `echo "Connection test"`
 * - timeout 超时时间（毫秒，默认 5000ms）
 * @returns 返回值 测试结果
 */
export const testConnWithErrMiddleware = async (
  config: SSHConfig,
  options: {
    testCommand?: string
    timeout?: number
  } = {}
): Promise<SSHResultType> => {
  const { testCommand, timeout } = {
    testCommand: 'echo "Connection test"',
    timeout: 5000,
    ...options
  }
  const testConnClosure = SSHErrorMiddleware(testConn, { config, timeout })
  return await testConnClosure(config, testCommand)
}

export type TestConnWithErrMiddlewareType = typeof testConnWithErrMiddleware
